package kgame5.enginex {

/*
 * 游戏循环中的计时器，保证被渲染的帧数跟实际需要渲染的帧数相当
 * 
 * function onEnterFrame():void{
 * 		var lostCount:int=gameloop.lostFrameCount();//计算缺失的帧
 * 		for(var i:int=0;i<lostCount;i++){
 * 			update();//游戏逻辑一帧
 * 		}
 * }
 */
import flash.utils.getTimer;

public class GameLoopX {
	private var m_timeOfLastUpdate : int;
	private var m_delay : int;//两帧之间的间隔

	private var m_accruedTime : int;
	private var deltaTime : int;

	public function GameLoopX( fsp:int=20 ) {
		//throw new Error("尚未经过测试，不安全!!");
		m_delay = 1000/fsp;
	}

	public function start() : void {
		
		m_timeOfLastUpdate = getTimer();
		m_accruedTime = 0;
	}
	
	//算出丢点的帧数，以便于补上
	//本次被调用时，应该使用的帧数
	public function lostFrameCount() : int {
		var currentTime : int = getTimer();
		deltaTime = currentTime - m_timeOfLastUpdate;
		m_timeOfLastUpdate = currentTime;
		
		m_accruedTime += deltaTime;
		var _lostFrameCount : int = m_accruedTime / m_delay;
		m_accruedTime %= m_delay;
		
		return _lostFrameCount;
	}
}
}
///////////////////////////////////////////////////////////
///**
// * @author kk
// * 已不推荐使用(!!此机制过于复杂，)
// * 
// * 1,计算缺失的
// * 2，补上帧（游戏逻辑的update）
// * 3,通知说刷新完毕
// * 
// * demo
// * run(){
// * 		var lostCount:int=gameloop.beforUpdate();//计算缺失的帧
// * 		for(var i:int=0;i<lostCount;i++){
// * 			update();//游戏逻辑一帧
// * 		}
// * 		gameLoop.afterUpdate();//标志刷新完毕,记录已刷新的帧的数量
// * }
// */
//public class GameLoopX {//通知外部执行预期的更新
//
//	private var expectedFrameIntervalMS:int;//期待的两帧之间的时间间隔
//	private var startTimeMS:int;
//	private var realRefeshedFrameCount:int;//迄今真正被刷新的帧
//	private var expectedRefeshedFrameCount:int;
//	
//	public function GameLoopX(fps:int){
//		expectedFrameIntervalMS=1000/fps;
//	}
//	
//	//启动
//	public function Start(){
//		startTimeMS=getTimer();
//		realRefeshedFrameCount=0;
//	}
//	
//	public function Clear(){
//	}
//	
//	//被外部每隔一段时间调用，两次调用这个相隔的时间不定。
//	//计算遗漏的帧
//	public function beforeUpdate():int{
//		
//		var curTimeMS:int=getTimer();
//		var durTimeMS:int=curTimeMS-startTimeMS;
//		expectedRefeshedFrameCount=durTimeMS/expectedFrameIntervalMS;//现在期待的刷新了多少帧
//		var missingFrameCount:int=expectedRefeshedFrameCount-realRefeshedFrameCount;
//		
//		return missingFrameCount;
//	}
//	
//	//记下已经被刷新的帧的数量
//	public function afterUpdate(){
//		realRefeshedFrameCount=expectedRefeshedFrameCount;
//	}
//	
//}//end of class
//}
